#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include "jcPrinter.h"

// 纸张类型枚举
enum PaperType {
    PAPER_70591 = 70591,  // 38*25mm
    PAPER_70277 = 70277,  // 50*30mm
    PAPER_240058 = 240058, // 30*15mm
    PAPER_70296 = 70296,  // 40*20mm
    PAPER_70279 = 70279,  // 30*20mm
    PAPER_70355 = 70355   // 24*12mm
};

// 打印模式枚举
enum PrintMode {
    SINGLE_BARCODE = 1,    // 单条码模式（二维码居中）
    BARCODE_WITH_TEXT = 2  // 带文本信息模式（条码居左，文本居右中）
};

// 纸张信息结构体
struct PaperInfo {
    float width;   // 宽度(mm)
    float height;  // 高度(mm)
    std::string name;
    
    PaperInfo() : width(0.0f), height(0.0f) {}
    PaperInfo(float w, float h, const std::string& n) : width(w), height(h), name(n) {}
};

// 坐标信息结构体
struct PositionInfo {
    float qr_x, qr_y, qr_width, qr_height;  // 二维码位置和尺寸
    float text_x, text_y, text_width, text_height;  // 文本位置和尺寸
    float text_line_height;  // 文本行高
    
    PositionInfo() : qr_x(0.0f), qr_y(0.0f), qr_width(0.0f), qr_height(0.0f),
                     text_x(0.0f), text_y(0.0f), text_width(0.0f), text_height(0.0f),
                     text_line_height(0.0f) {}
};

// 打印信息结构体
struct PrintInfo {
    int paperType;      // 纸张类型
    int printType;      // 打印类型：1=单条码，2=带文本信息
    char code[41];      // 40位条码信息（+1为结束符）
    char info[3][64];   // 最多3条商品信息，每条最多63字符
};

// 精臣条码打印机类
class BarcodePrinter {
public:
    // 构造函数
    BarcodePrinter();
    
    // 析构函数
    ~BarcodePrinter();
    
    // 初始化SDK
    bool initialize();
    
    // 清理资源
    void cleanup();
    
    // 统一打印函数
    bool printBarcode(const PrintInfo& printInfo);

private:
    // 计算不同纸张类型的坐标
    PositionInfo calculatePosition(PaperType paperType, PrintMode mode);
    
    // 检查SDK初始化状态
    bool isInitialized_;
    
    // 纸张类型映射
    static const std::map<PaperType, PaperInfo> paperTypes_;
};
